/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package frontera.dao;

import control.SIRHApp;
import entidad.CambiosCargos;
import entidad.Cargo;
import entidad.Horario;
import entidad.HorarioDia;
import java.util.ArrayList;
import java.util.Calendar;
import javax.persistence.EntityManager;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

/**
 *
 * @author tuareg
 */
public class CargoDAO  extends DAOT<Cargo>{

	public CargoDAO(String nombreEntidad) {
		super(nombreEntidad);
	}

	public CargoDAO() {
		this("Cargo");
	}
        
        @Override
        public boolean crear(Cargo nuevaEntidad) {
		boolean retorno = false;
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
                
                CambiosCargos cambiosTMP = new CambiosCargos();
                cambiosTMP.getCambios().add(nuevaEntidad);
                nuevaEntidad.setCambiosCargos(cambiosTMP);
		nuevaEntidad.setUltimaVersion(true);
                SIRHApp.getInstance().getDAOCamCargo().crear(cambiosTMP);
                
		try {                        
			em.persist(nuevaEntidad);
			em.getTransaction().commit();
			retorno = true;
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		} finally {
			em.close();
			return retorno;
		}
	}
        
	@Override
	public boolean actualizar(Cargo viejaEntidad, Cargo nuevaEntidad) {
            EntityManager em = emf.createEntityManager();
            em.getTransaction().begin();
            boolean ret= false;
            try {
                if(SIRHApp.getInstance().getAdmCambios().verificarFecha(viejaEntidad.getFechaDeModificacion(), 
                                                                        nuevaEntidad.getFechaDeModificacion())){
                    SIRHApp.getInstance().getDAOHorario().actualizar(viejaEntidad.getHorario(),nuevaEntidad.getHorario());
                    viejaEntidad = leer(viejaEntidad);
                    viejaEntidad.setNombre(nuevaEntidad.getNombre());
                    viejaEntidad.setNivelPermisos(nuevaEntidad.getNivelPermisos());
                    viejaEntidad.setEstado(nuevaEntidad.getEstado());
                    viejaEntidad.setDepartamento(nuevaEntidad.getDepartamento());
                    viejaEntidad.setSalarioBásico(nuevaEntidad.getSalarioBásico());
                    em.merge(viejaEntidad);
                    em.getTransaction().commit();
                    ret = true;
                }
                else{
                    try {
			    Horario nuevoHorario = nuevaEntidad.getHorario().copiar();
                        SIRHApp.getInstance().getDAOHorario().crear(nuevoHorario);
                                                    
                        for(HorarioDia hd : nuevoHorario.getHorario()){
                            hd.setHorario(nuevoHorario);
                            SIRHApp.getInstance().getDAOHorarioDia().crear(hd);
                            
                        }                        
			nuevaEntidad.setHorario(nuevoHorario);
                        nuevaEntidad.setCambiosCargos(viejaEntidad.getCambiosCargos());
                        viejaEntidad = leer(viejaEntidad);
			nuevaEntidad.setUltimaVersion(true);
			viejaEntidad.setUltimaVersion(false);
                        em.merge(viejaEntidad);
			em.persist(nuevaEntidad);
			em.getTransaction().commit();
			ret = true;
                    } catch (Exception e) {
                        e.printStackTrace();
			em.getTransaction().rollback();
                    } 
                }
            } catch (Exception e) {
                em.getTransaction().rollback();
            } finally {
                em.close();
                return ret;
            }
	}

public Cargo leer(Cargo par) {
            EntityManager em = emf.createEntityManager();
            Cargo cargo = null;

            Query q = em.createQuery(   "SELECT c FROM Cargo c " +
                                        "WHERE c.idCargo = :IDCARGO")
                                        .setParameter("IDCARGO", par.getIdCargo());
            try {                       
                cargo = (Cargo)q.getSingleResult();
            } catch (NonUniqueResultException e) {
                cargo = (Cargo)q.getResultList().get(0);
            } catch (Exception e){
                e.printStackTrace();
            }finally {
                em.close();
                return cargo;
            }
        }

        public ArrayList<Cargo> getCambiosID(long ID,Calendar fecha){
            EntityManager em = emf.createEntityManager();
            ArrayList<Cargo> cambios = null;
            
            Query q = em.createQuery(   "SELECT e FROM Cargo e " +
                                        "WHERE e.cambiosCargos.id = :CAMBIOSCARGO_ID AND "
                                        + "e.fechaDeModificacion <= :FECHA")
                                        .setParameter("CAMBIOSCARGO_ID",ID)
                                        .setParameter("FECHA", fecha);
            try {                       
                cambios = (ArrayList<Cargo>) q.getResultList();
            } catch (Exception e){
                e.printStackTrace();
            }finally {
                em.close();
                return cambios;
            }
        }

    public Cargo getMinimaFecha(){
            EntityManager em = emf.createEntityManager();
            Cargo cambios = null;
            
            Query q = em.createQuery(   "SELECT p FROM Cargo p "+
                                        "WHERE p.fechaDeModificacion=(SELECT MIN(p.fechaDeModificacion) FROM p)");
            try {                       
                cambios = (Cargo) q.getSingleResult();
            } catch (NonUniqueResultException e) {
                cambios = (Cargo) q.getResultList().get(0);
            } catch (Exception e){
                e.printStackTrace();
            }finally {
                em.close();
                return cambios;
            }
        }
    
}

	

